import router from '@/router'
import axios, {AxiosInstance, AxiosRequestConfig, AxiosResponse} from 'axios'
import {userStore} from "@/store";
import {Result} from "@/apis/model/common/common.interfaces";
import {ElMessage} from "element-plus";

/**
 * @auther boyyang-love
 * @NODE_ENV 根据当前环境确定请求地址
 * @development 开发环境、
 * @production 生产环境
 * @debug  测试环境
 */
const server: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_BASE_URL,
    timeout: 5000,
})

/**
 * axios请求拦截
 * @return
 * @config
 */
server.interceptors.request.use(
    (config: AxiosRequestConfig): AxiosRequestConfig | Promise<AxiosRequestConfig> => {
        if (config.method == 'get' || config.method == 'delete') {
            if (!(config.headers) || config.headers['Content-Type']) {
                // @ts-ignore
                config.headers.get['Content-Type'] = config.headers['Content-Type']
            } else {
                // @ts-ignore
                config.headers.get['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'
            }
        }
        if (config.method == 'post' || config.method == 'put') {
            if (!(config.headers) || config.headers['Content-Type']) {
                // @ts-ignore
                config.headers.post['Content-Type'] = config.headers['Content-Type']
            } else {
                // @ts-ignore
                config.headers.post['Content-Type'] = 'application/json;charset=utf-8'
            }
        }
        const store = userStore();
        // const token = '1111111';
        // token && (config.headers.Authorization = token);
        // @ts-ignore
        config.headers.token = store.token;
        // 此次判断登录的url地址是否存在token信息 ，否则全部跳转到login页面
        var url = config.url;
        if (url != '/login/in' && !store.token) {
            router.push("/login");
        }
        return config;
    },
    (error) => {
        return Promise.reject(error)
    }
)
/**
 * 响应拦截
 * @return
 * @response
 */

server.interceptors.response.use(
    (response: AxiosResponse<Result>): AxiosResponse<Result> | Promise<AxiosResponse<Result>> => {
        return response
    },
    error => {
        if (error && error.response) {
            switch (error.response.status) {
                case 400:
                    ElMessage.error('错误请求')
                    break;
                case 401:
                    ElMessage.error('未授权，请重新登录')
                    break;
                case 403:
                    ElMessage.error('拒绝访问')
                    break;
                case 404:
                    ElMessage.error('请求错误,未找到该资源')
                    break;
                case 405:
                    ElMessage.error('请求方法未允许')
                    break;
                case 408:
                    ElMessage.error('请求超时')
                    break;
                case 500:
                    ElMessage.error('服务器端出错')
                    break;
                case 501:
                    ElMessage.error('网络未实现')
                    break;
                case 502:
                    ElMessage.error('网络错误')
                    break;
                case 503:
                    ElMessage.error('服务不可用')
                    break;
                case 504:
                    ElMessage.error('网络超时')
                    break;
                case 505:
                    ElMessage.error('HTTP版本不支持该请求')
                    break;
                default:
                    ElMessage.error(`连接错误${error.response.status}`)
            }
        } else {
            ElMessage.error('服务未连接')
        }
        return Promise.resolve(error.response)
    }
)


/**
 * 导出get请求方法
 * @url 请求地址
 * @params get请求参数
 */
export function get(url: string, params?: any): Promise<Result> {
    return new Promise((resolve, reject) => {
        server.get(url, {
            params: params
        }).then((res) => {
            resolve(res.data)
        }).catch((err) => {
            reject(err)
        })
    })
}

/**
 * 导出get请求方法
 * @url 请求地址
 * @params get请求参数
 */
export function del(url: string, params?: any): Promise<Result> {
    return new Promise((resolve, reject) => {
        server.delete(url, {
            params: params
        }).then((res) => {
            resolve(res.data)
        }).catch((err) => {
            reject(err)
        })
    })
}

/**
 * 导出post请求方法
 * @url 请求地址
 * @params post请求参数
 */
export function post(url: string, params: any, config?: any): Promise<Result> {
    return new Promise((resolve, reject) => {
        server.post(url, params, config).then((res) => {
            resolve(res.data)
        }).catch((err) => {
            reject(err.data)
        })
    })
}


/**
 * 导出put请求方法
 * @url 请求地址
 * @params post请求参数
 */
export function put(url: string, params: any, config?: any): Promise<Result> {
    return new Promise((resolve, reject) => {
        server.put(url, params, config).then((res) => {
            resolve(res.data)
        }).catch((err) => {
            reject(err.data)
        })
    })
}


export function getURL(url: string) {
    return server.defaults.baseURL + url
}
